# Copyright (c) Facebook, Inc. and its affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.

load("//tools/build_defs:fb_native_wrapper.bzl", "fb_native")
load(
    "//tools/build_defs/oss:rn_codegen_defs.bzl",
    "rn_codegen_components",
    "rn_codegen_modules",
)
load(
    "//tools/build_defs/oss:rn_defs.bzl",
    "react_native_root_target",
)

fb_native.genrule(
    # The schema name must have the following format: "{name}-codegen-modules-schema"
    # Why: Internally, we have build scripts that find all NativeModule schemas in the
    # dependencies of an app, and build TurboModuleManager delegates. Those scripts assume
    # that all schema targets have the aforementioned naming scheme.
    name = "FBReactNativeSpec-codegen-modules-schema",
    srcs = glob(
        [
            "**/*.js",
        ],
        exclude = [
            "**/__tests__/**/*",
        ],
    ),
    cmd = "$(exe {}) $OUT $SRCS".format(react_native_root_target("packages/react-native-codegen:write_to_json")),
    out = "schema.json",
    labels = [
        "codegen_rule",
        "react_native_schema_target",
    ],
)

rn_codegen_modules(
    name = "FBReactNativeSpec",
    android_package_name = "com.facebook.fbreact.specs",
    library_labels = ["supermodule:xplat/default/public.react_native.infra"],
    schema_target = ":FBReactNativeSpec-codegen-modules-schema",
)

rn_codegen_components(
    name = "FBReactNativeComponentSpec",
    library_labels = ["supermodule:xplat/default/public.react_native.infra"],
    # Why does FBReactNativeComponentSpec depend on -codegen-modules-schema?
    # The module codegen schema also contains components. We cannot change the name
    # of the schema target, because internally, we have infra that depends on how
    # it's named.
    #
    # TODO(T83341482): Clean up how OSS NativeModule codegen is declared
    schema_target = ":FBReactNativeSpec-codegen-modules-schema",
)
